Código duplicado
El código duplicado es un término en programación de computadores para una secuencia de código fuente que ocurre más de una vez, dentro de un programa o a través de diferentes programas, de propiedad, o mantenido, por la misma entidad. El código duplicado es considerado indeseable por una serie de razones.[1] Un requisito mínimo es usualmente aplicado a la cantidad de código que debe aparecer en una secuencia para ser considerado duplicado en vez de coincidentemente similar. Secuencias de código duplicado se conocen como clones de código o simplemente clones.
Las siguientes son algunas de las maneras en que dos secuencias de código pueden ser duplicadas una de la otra:
- idénticas carácter por carácter
- idénticas carácter por carácter cuando son ignorados los caracteres de espacio en blanco y los comentarios
- idénticas token-por-token
- idénticas token-por-token con variación ocasional (es decir, inserción/eliminación/modificación de tokens)
- funcionalmente idénticas
¿Cómo es creado el código duplicado?
[editar]Hay un número de razones del por qué el código duplicado puede ser creado, incluyendo:
- Programación basada en copia y pega, en donde una sección de código es copiada "porque funciona". En la mayoría de los casos esta operación implica ligeras modificaciones en el código clonado como cambio de nombre de variables o insertar/eliminar código.
- Es requerida funcionalidad que es muy similar a la que está en otra parte de un programa, y un desarrollador independiente escribe código que es muy similar a lo que ya existe en otro lugar.
- Plagio, donde el código es simplemente copiado sin permiso o atribución.
Problemas asociados con el código duplicado
[editar]La duplicación de código es generalmente considerada una señal de estilo de programación pobre o perezoso. Buen estilo de codificación es generalmente asociado con la reutilización de código. Puede ser ligeramente más rápido desarrollar por duplicación de código, porque el desarrollador no necesita preocuparse en cómo es utilizado el código actualmente o cómo puede ser usado en el futuro. La dificultad es que el desarrollo original es sólo una pequeña fracción del ciclo de vida de un producto, y con la duplicación de código, los costos de mantenimiento son mucho mayores. Algunos de los problemas específicos incluyen:
- Un montón de código afecta la comprensión: El código duplicado con frecuencia crea largas secciones repetidas de código que difieren en sólo unas pocas líneas o caracteres. La longitud de estas rutinas puede hacerlo difícil de comprenderlas rápidamente. Esto está en contraste con las "mejores prácticas" de descomposición de código.
- Enmascaramiento de propósito: La repetición de largas secciones idénticas de código pueden ocultar cómo difieren unas de las otras, y por lo tanto, cuál es el propósito específico de cada sección de código. A menudo, la única diferencia es un valor de parámetro. La mejor práctica en tales casos es una subrutina reutilizable.
- Anomalías de actualización: El código duplicado contradice el principio fundamental de la teoría de base de datos que se aplica aquí: evitar la redundancia. La inobservancia incurre en anomalías de actualización, que aumentan los costos de mantenimiento, en donde cualquier modificación a una pieza redundante de código debe hacerse separadamente para cada duplicado. En el mejor caso, el tiempo de codificación y pruebas son multiplicados por el número de duplicaciones. En el peor de los casos, puede faltar actualizar en algunos lugares, y por ejemplo erroresque se piensan fueron corregidos pueden persistir en lugares duplicados durante meses o años. La mejor práctica aquí es una biblioteca de código.
- Tamaño del archivo: A menos que una compresión sin pérdida sea aplicada, el archivo tomará más espacio en el computador.
Detectando el código duplicado
[editar]Se han propuesto una serie de algoritmos para detectar el código duplicado. Por ejemplo:
- Algoritmo de Baker.[2]
- Usando el algoritmo Karp-Rabin.
- Utilizando árboles de sintaxis abstracta.[3]
- Detección visual del clon.[4]
Ejemplo de código duplicado funcional
[editar]Considere el siguiente fragmento de código para calcular el promedio de un arreglo de enteros
extern int arreglo1[];
extern int arreglo2[];
int suma1 = 0;
int suma2 = 0;
float promedio1 = 0.0;
float promedio2 = 0.0;
for (int i = 0; i < 4; i++)
{
suma1 += arreglo1[i];
}
promedio1 = suma1 / 4;
for (int i = 0; i < 4; i++)
{
suma2 += arreglo2[i];
}
promedio2 = suma2 / 4;
Los dos bucles pueden ser reescritos en una simple función:
int calculaPromedio (int* arreglo_de_4)
{
int suma = 0;
for (int i = 0; i < 4; i++)
{
suma += arreglo_de_4[i];
}
return suma / 4;
}
Usando la función de arriba, dará código fuente que no tiene duplicación de bucles:
extern int arreglo1[];
extern int arreglo2[];
float promedio1 = calculaPromedio(arreglo1);
float promedio2 = calculaPromedio(arreglo2);
Referencias
[editar]- ↑ Spinellis, Diomidis. «The Bad Code Spotter's Guide». InformIT.com. Archivado desde el original el 18 de octubre de 2012. Consultado el 6 de junio de 2008.
- ↑ Brenda S. Baker. A Program for Identifying Duplicated Code. Computing Science and Statistics, 24:49–57, 1992.
- ↑ Ira D. Baxter, et al. Clone Detection Using Abstract Syntax Trees
- ↑ Visual Detection of Duplicated Code Archivado el 29 de junio de 2006 en Wayback Machine. by Matthias Rieger, Stephane Ducasse.